package com.talent.service.impl;

import com.talent.common.Constants;
import com.talent.config.JwtProperties;
import com.talent.handler.BaseException;
import com.talent.interceptor.BaseContext;
import com.talent.mapper.UserMapper;
import com.talent.pojo.dto.ChangePasswordDTO;
import com.talent.pojo.dto.UserLoginDTO;
import com.talent.pojo.entity.User;
import com.talent.pojo.vo.UserLoginVO;
import com.talent.pojo.vo.UserVO;
import com.talent.service.AuthService;
import com.talent.utils.JwtUtil;
import com.talent.utils.PasswordUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

/**
 * 认证服务实现类
 */
@Service
public class AuthServiceImpl implements AuthService {

    @Autowired
    private UserMapper userMapper;

    @Autowired
    private JwtProperties jwtProperties;

    /**
     * 用户登录
     */
    @Override
    public UserLoginVO login(UserLoginDTO userLoginDTO) {
        String username = userLoginDTO.getUsername();
        String password = userLoginDTO.getPassword();

        // 1、根据用户名查询数据库中的数据
        User user = userMapper.getByUsername(username);

        // 2、处理各种异常情况（用户名不存在、密码不对）
        if (user == null) {
            // 账号不存在
            throw new BaseException("用户名或密码错误");
        }

        // 密码比对
        if (!PasswordUtil.matches(password, user.getPassword())) {
            // 密码错误
            throw new BaseException("用户名或密码错误");
        }

        // 3、返回User对象
        Map<String, Object> claims = new HashMap<>();
        claims.put(Constants.JWT_CLAIMS_USER_ID, user.getId());
        claims.put(Constants.JWT_CLAIMS_USERNAME, user.getUsername());
        String token = JwtUtil.createJWT(
                jwtProperties.getSecretKey(),
                jwtProperties.getTtl(),
                claims);

        UserLoginVO userLoginVO = new UserLoginVO();
        userLoginVO.setToken(token);

        UserVO userVO = new UserVO();
        BeanUtils.copyProperties(user, userVO);
        userLoginVO.setUser(userVO);

        return userLoginVO;
    }

    /**
     * 修改密码
     */
    @Override
    public void changePassword(ChangePasswordDTO changePasswordDTO) {
        Long currentUserId = BaseContext.getCurrentUserId();
        
        // 查询当前用户
        User user = userMapper.getById(currentUserId);
        if (user == null) {
            throw new BaseException("用户不存在");
        }

        // 验证旧密码
        if (!PasswordUtil.matches(changePasswordDTO.getOldPassword(), user.getPassword())) {
            throw new BaseException("旧密码错误");
        }

        // 设置新密码
        user.setPassword(PasswordUtil.encode(changePasswordDTO.getNewPassword()));

        userMapper.update(user);
    }
}
